<?php 

session_start();
class CratTool{
    private static $ins=null;
    private $items=array();//将$items数组实现单例
    final protected function __construct(){
    }
    final protected function __clone(){
    }

    /**获取单例
     * @return CratTool|null
     */
    static protected function getIns(){
        if (self::$ins instanceof self){
            return self::$ins;
        }
        self::$ins=new self;
        return self::$ins;
    }

    /**
     * @return CratTool|null
     */

    public static function getCart(){
        if(!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)){
            $_SESSION['cart']=self::getIns();
        }
        return $_SESSION['cart'];
    }
    
    
    /**
     * 判断购物车中某商品是否存在
     * @param $id
     * @return bool
     */
    public function  hasItem($id){
        return array_key_exists($id,$this->items);
    }    

    /**添加商品加入购物车
     * @param $id 商品Id
     * @param $name 商品名称
     * @param $price 商品价格
     * @param $num  商品数量
     */
    public function addItem($id,$name,$price,$num=1){
        if ($this->hasItem($id)){//添加商品如果购物车中已经有该商品则商品数量加1
            $this->incNum($id,$num);
            return;
        }
        $item=array();
        $item['name']=$name;
        $item['price']=$price;
        /** @var int $num */
        $item['num']=$num;
        $this->items[$id]=$item;
    }
    
    /**
     * 修改购物车中的商品数量
     * @param $id   商品主键
     * @param int $num  某商品修改后的商品数量，即直接把某商品的数量改为$num
     * @return bool
     */
    public function modNum($id,$num=1){
        if (!$this->hasItem($id)){
            return false;
        }
        $this->items[$id]['num']=$num;
    }
    /**
     * 商品数量 加1
     * @param $id
     */
    public function incNum($id,$num){
        if ($this->hasItem($id)){
            $this->items[$id]['num'] += $num;
        }
    }
    /**
     * 删除商品
     * @param $id
     */
    public function delItem($id){
        unset($this->items[$id]);
    }
    /**
     * 商品数量 减1
     * @param $id
     */
    public function decNum($id,$num=1){
        if ($this->hasItem($id)){
            $this->items[$id]['num'] -= $num;
        }
        //如果减少后，数量为0了，则把这个商品从购物车中删除
        if ($this->items[$id]['num'] < 1 ){
            $this->delItem($id);
        }
    }

    /**
     * 查询购物车中商品的种类
     * @return int
     */
    public function getCnt(){
        return count($this->items);
    }

    /**
     * 查询购物车中商品的数量
     * @return int
     */
    public function getNum(){
        if ($this->getCnt() == 0){
            return 0;
        }
        $sum=0;
        foreach ($this->items as $item){
            $sum += $item['num'];
        }
        return $sum;
}

    /**
     * 查询购物车中商品的总金额
     * @return float|int
     */
    public function getPrice(){
        if ($this->getCnt() == 0){
            return 0;
        }
        $price =0.0;
        foreach ($this->items as $item){
            $price += $item['num'] * $item['price'];
        }
        return $price;

    }

    /**
     * 返回购物车中的所有商品
     * @return array
     */
    public function all(){
        return $this->items;
    }
    /**
     * 清空购物车
     */
    public function clear(){
        $this->items=array();
    }
}


 ?>